package com.hxx.gongping;

import com.hxx.danji.MQConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 1、消费者应答模式
 * 2、手动签收
 */
public class Customer02 {
    private static final String QUEUE_NAME = "hxx-test_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        //  System.out.println("002");
        // 1.获取连接
        Connection newConnection = MQConnectionUtils.newConnection();
        // 2.创建通道
        final Channel channel = newConnection.createChannel();

        //3、消费者关联队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        channel.basicQos(1);  //每次消费一条、必须消费完才能继续消费
        
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
            //监听获取到的消息
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                String msgString = new String(body, "UTF-8");

                System.out.println("公平消费者获取消息(应答模式):" + msgString);

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //手动应答模式开启
                    channel.basicAck(envelope.getDeliveryTag(), false);
                }
            }
        };


        /**
         * 设置应答模式、
         * 如果为true情况下、表示为自动应答模式
         * 分为自动应答和手动应答
         *
         * 自动应答：不在乎消费者对这个消息处理是否成功、都会告诉队列删除该消息、
         * 如如处理消息失败情况下、实现自动补偿
         *
         * 手动应答：消费处理完业务逻辑、手动返回ack(通知) 、
         * 告诉给对列服务器 是否删除该消息
         */
        channel.basicConsume(QUEUE_NAME, false, defaultConsumer);

    }

}